/*
 * @Descripttion: 应用程序请求中间件，在每次请求时触发。可在配置文件中设置是否启用
 * @version: 
 * @Author: turingchang
 * @Date: 2020-12-16 11:14:48
 * @LastEditors: turingchang
 * @LastEditTime: 2020-12-16 11:28:03
 */



module.exports = (options, app) => {
    return async function authHandler(ctx, next) {
        var ss = '';
        var s = '';
        if (options.enable === true) {
            var token = ctx.header.authorization;
            // console.log('token', token);
            //先排除不需要验证 token 的路由
            if (options.allowed.indexOf(ctx.request.url) > -1) {
                return await next(options);
            } else {
                if (ctx.app.utils.validator.isNull(token)) {
                    // ss =`${new Date().toLocaleString()} [${ctx.ip}] [${ctx.method} ${ctx.url}] : ${ctx.app.enums.response_code_enum.invalid_token.msg} \n`;
                    // s =ctx.app.config.console.request.style+ss+ctx.app.config.console.request.style;
                    // console.log(s.bgMagenta);
                    ctx.requestLogger.info(ctx.app.enums.response_code_enum.invalid_token.msg);
                    ctx.outError(null, null, ctx.app.enums.response_code_enum.invalid_token);
                } else {
                    //处理token                
                    var data = {};
                    try {                       
                        data = ctx.app.jwt.verify(token, ctx.app.config.jwt.secret);
                    } catch (err) {
                        var msg = '';
                        if (err.name === 'TokenExpiredError') {
                            ctx.requestLogger.info(ctx.app.enums.response_code_enum.token_expired.msg);
                            return ctx.outError(null, null, ctx.app.enums.response_code_enum.token_expired);
                        } else {
                            ctx.requestLogger.info(ctx.app.enums.response_code_enum.invalid_token.msg);
                            return ctx.outError(null, null, ctx.app.enums.response_code_enum.invalid_token);
                        }
                    }
                    ctx.token = token;
                    // user{
                    //     id:admin.id,
                    //     name:admin.name
                    // }
                    //获取用户信息
                    if (ctx.app.utils.validator.isNull(data)) {
                        ctx.requestLogger.info(ctx.app.enums.response_code_enum.invalid_token.msg);
                        return ctx.outError(null, null, ctx.app.enums.response_code_enum.invalid_token);
                    }
                    var admin = await ctx.service.admin.admin.get(data.id);
                    ctx.user = admin;
                    await next(options); 
                }
            }

        } else {
            await next(options);
        }

    };

};